#include "nfc_read_led.h"
#include "key.h"
#include "tim_out.h"
static readled_info readled_data;
/**
 * @brief 初始化读取LED的状态
 * 
 * 该函数用于初始化与读取LED相关的数据结构，准备进行后续的LED读取操作。
 * 初始化内容包括设置开始状态和LED状态测试的初始值。
 * 
 * 注意：此函数不接受任何参数，也不返回任何值。
 */
void nfc_read_led_init(void)
{
    /* 设置初始的开始状态为稳定状态 */
    readled_data.start_keyStableState = true;
    
    /* 设置LED状态测试的初始值为未测试状态 */
    readled_data.t_st = NOT_TESTED;

    TimeTick_Init();
}
/*
 * 函数名称: Loop_Start_button
 * 功能描述: 启动测试按键检测，用于检测启动测试的按键是否被按下，并处理按键事件。
 * 参数说明: 无
 * 返回值: 无
 * 备注: 使用了消抖技术来避免因按键抖动造成的误判。
 */
void Readled_Start_button(void)
{
    // 定义一个静态变量，用于计数去抖动时间
    volatile static unsigned int start_debounceCounter = 0;
    // 检测按键是否被按下
    if ((0 == RTE_GPIO_PIN_GET_LEVEL(GPIOA, START1_TEST_I_PA15_Pin) || 0 == RTE_GPIO_PIN_GET_LEVEL(GPIOA, START2_TEST_I_PA9_Pin)))
    {
        // 如果之前按键是稳定的（未按下状态）
        if (true == readled_data.start_keyStableState)
        {                                            // 按键状态由稳定变为不稳定，记录按键按下时间
            start_debounceCounter = RTE_GET_TIMER(); // 记录当前时间作为按键按下时间的起点
            readled_data.start_keyStableState = false;  // 更新按键状态为不稳定
        }
        else if (yes_timeout == RTE_TIMEOUT_JUDGMENT(start_debounceCounter, 1000))
        {
           readled_data.start_keyStableState = true;  // 更新按键状态为不稳定
           if (NOT_TESTED == readled_data.t_st)
           {
                RTE_GPIO_PIN_SET_LEVEL(GPIOC, OverCurCtr_O_LL_PC13_Pin, GPIO_PIN_SET);/*产品上电*/
				RTE_GPIO_PIN_SET_LEVEL(GPIOE, Short_CTRL_PE5_Pin, GPIO_PIN_SET);
                readled_data.t_st = DURING_TEST;/* 产品上电 */
           }else if (DURING_TEST == readled_data.t_st)
           {
                RTE_GPIO_PIN_SET_LEVEL(GPIOC, OverCurCtr_O_LL_PC13_Pin, GPIO_PIN_RESET);/*产品下电*/
                readled_data.t_st = NOT_TESTED;/* 产品下电 */
           }
           
        }
    }
}

/* NFC读取LED主函数 */
/* 该函数负责在特定条件下发送CAN报文以控制LED灯 */
void nfc_read_led_main(void)
{
    /* 记录上次发送报文的时间，用于判断是否超时 */
    static uint32_t Record_send_time = 0; /*记录_发送_时间*/
    
    /* CAN报文数据，用于控制LED灯，初始值设定为点亮LED的指令 */
    static uint8_t can_NFC_LIGHT[8] = {0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};    /*can请求亮灯*/
    
    /* 当前状态为测试状态时，执行以下逻辑 */
    if (DURING_TEST == readled_data.t_st)
    {
        /* 判断是否超过设定的 debounce 时间，防止频繁发送报文 */
        if (yes_timeout == RTE_TIMEOUT_JUDGMENT(Record_send_time, DEBOUNCE_TIME_MS))
        {
            /* 更新发送时间 */
            Record_send_time = RTE_GET_TIMER(); 
            /* 发送CAN报文，控制LED灯 */
            /*发送点亮报文*/
            RTE_CAN_TRANSMIT(0x310,can_NFC_LIGHT,8);          /*can请求亮灯*/
        }
    }
}
